package com.cjd.common.okhttp3

import com.cjd.common.utils.GenericParamUtil
import com.cjd.common.utils.GsonUtils
import com.cjd.common.utils.LogUtils
import okhttp3.Call
import okhttp3.Callback
import okhttp3.Response
import java.io.IOException
import java.net.HttpURLConnection

/**
 * @author chenjidong
 * @email 374122600@qq.com
 * created 2020/5/29/0029
 * description OkHttp3 异步请求回调封装
 */
abstract class OkHttp3Callback<T> : Callback {

    override fun onFailure(p0: Call?, p1: IOException?) {
        onFinish()
        p1?.let { LogUtils.e(it) }
        onFailure("系统繁忙！")
    }

    override fun onResponse(p0: Call?, p1: Response) {
        onFinish()
        if (p1.code() == HttpURLConnection.HTTP_OK) {
            val json = p1.body()?.string()
            val clazz: Class<T> = GenericParamUtil.getClassT(this, 0) as Class<T>
            onSuccess(GsonUtils.instance().fromJson(json, clazz))
        } else
            onFailure(null)
    }

    /**
     * 请求成功回调 只有 200 才会进入
     */
    abstract fun onSuccess(json: T)

    /**
     * 非200 或其他异常时回调  包括业务逻辑
     * @param error 错误信息，业务逻辑信息 可直接输出
     */
    open fun onFailure(error: String?) {

    }

    /**
     * 成功或失败之前均会调用
     */
    open fun onFinish() {

    }
}